package 剑指Offer._5160;

import java.util.Arrays;

/**
 * @author yzh
 * @version 1.0
 * @date 2021/11/23 17:30
 * n个骰子的点数
 * 把n个骰子扔在地上，所有骰子朝上一面的点数之和为s。输入n，打印出s的所有可能的值出现的概率。
 * 你需要用一个浮点数数组返回答案，其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。
 * 算法：动态规划
 * 看成不断地加骰子
 * 当 n = 1 时，[1, 6] 的个数都为 1
 * 当 n = 2 时，[2, 12] 的个数都是 n 为 1 时，各数加上 [1, 6] 得到的
 * 这样就可以得到递推关系了
 */
public class _60 {
    public static void main(String[] args) {
        System.out.println(Arrays.toString(dicesProbability(2)));
    }

    public static double[] dicesProbability(int n) {
        double[] ans = new double[6];
        Arrays.fill(ans, 1.0 / 6);
        for (int i = 2; i <= n; i++) {
            double[] tmp = new double[5 * i + 1];
            for (int j = 0; j < ans.length; j++)
                for (int k = 0; k < 6; k++) tmp[j + k] += ans[j] / 6;
            ans = tmp;
        }
        return ans;
    }

}
